package ModeloLogicoSistema;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 * @author veko
 */
enum EstadoOrden {

    PENDIENTE, LISTA, ENTREGADA, ANULADA
};

public class Orden implements Comparable, Comparator{

    private Integer codOrden;
    private Integer codCliente;
    private String fechaPedido;
    private String fechaPactada;
    private String fechaHoraEntrega;
    private String horaPactadaDesde;
    private String horaPactadaHasta;
    private String situacionOrden;
    private Double montoTotal;
    private Double montoAbonado;
    private Double montoAdeudado;
    private Double montoDescuento;
    private Boolean delivery;
    private String lugarDeAlmacenajePedidoListo;
    private List<Servicio> serviciosContratados;
    private String horaPedido;
    private String fechaListo;
    private String observaciones;
    private String horaEntrega;
    private String horaListo;
    

    //Constructores
    public Orden(Integer codOrden) {
        this.codOrden = codOrden;
    }
    @Override
    public int compare(Object o1, Object o2) {
        return ((Orden)o1).getCodOrden()-((Orden)o2).getCodOrden();
    }
    
    public int compare(Orden o1, Orden o2) {
        return ((Orden)o1).getCodOrden()-((Orden)o2).getCodOrden();
    }
    
    public int compareTo(Object orden){
        Orden orden2 = (Orden)orden;
        Calendar calendar=new GregorianCalendar();
        SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");
        Date fecha=null;
        Date fecha2=null;
        try {
            fecha=formateador.parse(fechaPactada);
            fecha2=formateador.parse(orden2.fechaPactada);
        } catch (ParseException ex) {
            Logger.getLogger(Orden.class.getName()).log(Level.SEVERE, null, ex);
        }
        if(fecha.compareTo(fecha2)< 0)
                    return -1;
        else
                    return 1;
                
    }
    

    public Orden(Integer codOrden, String fechaHoraPedido,String fechaEntrega, String fechaEntregaPactada, String horaEntrega ,
            List<Servicio> serviciosContratados, Double montoTotal, Double montoAbonado,
            Double montoAdeudado,Double montoDescuento, Boolean delivery,String estado) {
        String fecha = fechaHoraPedido.substring(0, 10);
        String hora = fechaHoraPedido.substring(11);
        this.codOrden = codOrden;
        this.fechaPedido = fecha;
        this.horaPedido=hora;
        this.fechaPactada = fechaEntregaPactada;
        this.horaPactadaDesde = horaEntrega;
        this.serviciosContratados = serviciosContratados;
        this.montoTotal = montoTotal;
        this.montoAbonado = montoAbonado;
        this.montoAdeudado = montoAdeudado;
        this.montoDescuento=montoDescuento;
        this.delivery = delivery;
        this.situacionOrden=estado;
    }

    //getters
    public Integer getCodCliente() {
        return codCliente;
    }

    public String getFechaEntrega() {
        return fechaHoraEntrega;
    }

    public Double getMontoAbonado() {
        return montoAbonado;
    }

    public Double getMontoAdeudado() {
        return montoAdeudado;
    }

    public String getLugarDeAlmacenajePedidoListo() {
        return lugarDeAlmacenajePedidoListo;
        
    }

    public Integer getCodOrden() {
        return codOrden;
    }

    public String getFechaPedido() {
        return this.fechaPedido;
    }
    
    
    public String getHoraPedido() {
        return this.horaPedido;
    }

    public String getFechaEntregaPactada() {
        return fechaPactada;
    }

    public String getHoraPactadaDesde() {
        return horaPactadaDesde;
    }

    public String getSituacionOrden() {
        
        return situacionOrden;
     
    }

    public List<Servicio> getServiciosContratados() {
        /*List<Servicio> serviciosRdo=new ArrayList();
         ListIterator it=this.serviciosContratados.listIterator();
         while (it.hasNext()) {
         Servicio serv=new Servicio();
         serviciosRdo.add(serv);
         }*/
        return serviciosContratados;
    }

    public Double getMontoTotal() {
        return montoTotal;
    }

    public Boolean tieneDelivery() {
        return delivery;
    }

    //Setters
    public void setCodCliente(Integer codCliente) {
        this.codCliente = codCliente;
    }

    public void setFechaHoraPedido(String fechaPedido,String horaPedido) {
        this.fechaPedido = fechaPedido;
        this.horaPedido=horaPedido;
    }

    public void setFechaPactada(String fechaPactada) {
        this.fechaPactada = fechaPactada;
    }

    public void setEntrega(String fechaHoraEntrega) {
        this.situacionOrden = EstadoOrden.ENTREGADA.toString();
        this.fechaHoraEntrega = fechaHoraEntrega;
    }

    public void setHoraPactadaDesde(String horaPactadaDesde) {
        this.horaPactadaDesde = horaPactadaDesde;
    }
    
    public void setHoraPactadaHasta(String horaPactadaHasta) {
        this.horaPactadaHasta = horaPactadaHasta;
    }

    public void setSituacionOrden(String situacionOrden) {
        this.situacionOrden = situacionOrden;
    }

    public void setTotalMonto(Double montoTotal) {
        this.montoTotal = montoTotal;
    }

    public void setMontoAbonado(Double montoAbonado) {
        this.montoAbonado = montoAbonado;
    }

    public void setMontoAdeudado(Double montoAdeudado) {
        this.montoAdeudado = montoAdeudado;
    }

    public void setDelivery(Boolean delivery) {
        this.delivery = delivery;
    }


    public void setServiciosContratados(List<Servicio> serviciosContratados) {
        this.serviciosContratados = serviciosContratados;
    }

    //Se usan para cargar desde la base de datos
    public void modificarFechaEntregaPactada(String fechaEntregaPactada) {
        this.fechaPactada = fechaEntregaPactada;
    }

    public void modificarHoraEntrega(String horaEntrega) {
        this.horaPactadaDesde = horaEntrega;
    }

    public void ordenLista(String lugarDeAlmacenajePedidoListo) {
        this.lugarDeAlmacenajePedidoListo=lugarDeAlmacenajePedidoListo;
        this.situacionOrden= EstadoOrden.LISTA.toString();
    }

    //Se hace directamente en la base de datos
    /*public void agregarServicio(Servicio servicio) {
     if((this.situacionOrden!=EstadoOrden.ANULADO) & (this.situacionOrden!=EstadoOrden.ENTREGADO)){
     this.serviciosContratados = serviciosContratados;
     }
     }*/
    //Se hace directamente en la base de datos
    /*public void quitarServicio(Servicio servicio) {
     if((this.situacionOrden!=EstadoOrden.ANULADO) & (this.situacionOrden!=EstadoOrden.ENTREGADO)){
     this.serviciosContratados = serviciosContratados;
     }
     }*/
    //Se hace directamente en la base de datos
    /*public void modificarMontoAbonado(Float montoAbonado) {
     this.montoAbonado = montoAbonado;
     }*/
    //Se hace directamente en la base de datos
    /*
     public void cambiarEstadoDelivery() {
     if (delivery)
     delivery=false;
     else
     delivery=true;
     }*/

    void setLugarAlmacenaje(String lugarDeAlmacenajePedidoListo) {
        this.lugarDeAlmacenajePedidoListo=lugarDeAlmacenajePedidoListo;
    }

    public void setFechaListo(String fechaListo) {
        this.fechaListo=fechaListo;
    }
    
    public void setHoraEntrega(String horaEntrega){
        this.horaEntrega=horaEntrega;
    }
    
    public void setHoraListo(String horaListo){
        this.horaListo=horaListo;
    }
    
    public String getHoraEntrega(){
        return this.horaEntrega;
    }

    public String getHoraListo(){
        return this.horaListo;
    }
    
    public void setDescuento(Double descuento){
        this.montoDescuento=descuento;
    }
    
    public String getFechaListo() {
        return this.fechaListo;
    }

    public String getObservaciones() {
        return this.observaciones;
    }

    void setObservaciones(String observaciones) {
        this.observaciones=observaciones;
    }

    public Double getDescuento() {
        return this.montoDescuento;
    }

    public String getHoraPactadaHasta() {
        return this.horaPactadaHasta;
    }
                    


}


class ComparaDelivery implements Comparator{
   @Override
   public int compare (Object o1, Object o2){
      Orden orden1, orden2;
      orden1=(Orden)o1;
      orden2=(Orden)o2;
      String horaD = orden1.getHoraPactadaDesde(). substring(0 , orden1.getHoraPactadaDesde().indexOf(":"));
      String horaH = orden1.getHoraPactadaHasta(). substring(0 , orden1.getHoraPactadaHasta().indexOf(":"));
      String horaD2 = orden2.getHoraPactadaDesde(). substring(0 , orden2.getHoraPactadaDesde().indexOf(":"));
      String horaH2 = orden2.getHoraPactadaHasta(). substring(0 , orden2.getHoraPactadaHasta().indexOf(":"));
      Integer horaDesde1=Integer.valueOf(horaD);
      Integer horaHasta1=Integer.valueOf(horaH);
      Integer horaDesde2=Integer.valueOf(horaD);
      Integer horaHasta2=Integer.valueOf(horaH);
      if( horaDesde1< horaDesde2){//orden de menos a mayor
         return -1;
      }else if(horaDesde2 < horaDesde1){
         return 1;
      }else{
          if(horaHasta1<horaHasta2)
              return -1;
          else if(horaHasta2<horaHasta1)
              return 1;
          else return 0;
      }
   }
}